Use case: DCACHE error interrupt handling

Sequence diagram

DCACHE error interrupt handling.

  @startuml
  participant "User\nApplication" as UA
  participant "DCACHE\nDriver" as DD
  participant "DCACHE_IRQHandler" as IRQ

  skinparam sequenceMessageAlign center

  == Init DCACHE ==
  |||
  opt USE_HAL_DCACHE_REGISTER_CALLBACKS
      UA -> DD: **HAL_DCACHE_RegisterCallback**(&hdcache, HAL_DCACHE_ERROR_CB_ID, USER_DCACHE_ErrorCallback)
      DD --> UA : return HAL_OK
  end
  |||
  UA -> DD : **HAL_DCACHE_Enable**
  DD --> UA : return HAL_OK
  UA -> DD : **__HAL_DCACHE_ENABLE_IT**
  note right : Enable Interruption (Eviction Clean)
  |||
  == Interruption Service Routine ==
  |||
  IRQ <- : Error\ninterrupt
  IRQ -> DD : **HAL_DCACHE_IRQHandler**
  note left : Interruption execution
  alt USE_HAL_DCACHE_REGISTER_CALLBACKS
      DD -> UA : **USER_DCACHE_ErrorCallback**
      DD <-- UA
  else USE OVERRIDDEN WEAK CALLBACKS
      DD -> UA : **HAL_DCACHE_ErrorCallback**
      DD <-- UA
  end
  |||
  @enduml

Code snippet

HAL1

HAL2

/* Optional: register error callback */
HAL_DCACHE_RegisterCallback(&hdcache, HAL_DCACHE_ERROR_CB_ID,
                            USER_DCACHE_ErrorCallback);

HAL_DCACHE_Enable(&hdcache);
__HAL_DCACHE_ENABLE_IT(&hdcache, DCACHE_IT_ERR);

/* In IRQ handler */
void DCACHE_IRQHandler(void)
{
  HAL_DCACHE_IRQHandler(&hdcache);
}
/* Optional: register error callback */
HAL_DCACHE_RegisterErrorCallback(DCACHE_Error_UserCallback);

/* Start DCACHE with error interrupt enabled */
HAL_DCACHE_Start(&hdcache, HAL_DCACHE_IT_ERROR);

/* In IRQ handler */
void DCACHE_IRQHandler(void)
{
  HAL_DCACHE_IRQHandler(&hdcache);
}

Key changes

  1. HAL2 uses HAL_DCACHE_RegisterErrorCallback() instead of registering by callback ID.

  2. HAL2 enables error interrupts as part of HAL_DCACHE_Start().

  3. Error processing is still performed through HAL_DCACHE_IRQHandler().